version PDF (0.141 MB)
<http://www.slideshare.net/juancaslideshare/motorola-freescale-mc68hc908gp32-microcontroller-documentacion-control-de-nivel-tanque>
Vídeo: Circuito control tanque (See it in youtube - Disponible en youtube )
Documentación Control de nivel de tanque (1.2 MB)
Terminado, luego de 3 pruebas, Junio 15 de 2008

Realiza conversion AD por el PTB0 con muestrear();
Retorna "resultado"
"resultado" se almacena en MEMORIA1[i] (MEMORIA1[i]=resultado)
MEMORIA1[i] Se envia via SCI RS232 TX PIN 12 MICROGP32 al PC
Se recibe un caracter via SCI rs232 RX pin 13 MICROGP32 desde el pc
Se almacena en MEMORIA2[i]=sci_leer_car();
Se verifica si el valor "ValorMax" se ha llegado
verdadero==> Prender calentador durante delay_s(X) "X segundos"
Transcurrido el delay_s(X) se envia el valor Hexa correspondiente al asscii del "6"
Se envía al PC el mensaje para que active el vaciado
Se coloca en el puerto A PTA=MEMORIA2[i]
Se debe tener programa RS232J13.CPP


#include /* for EnableInterrupts macro */
#include /* include peripheral declarations */
#include

/* El sistema tiene una frecuencia externa de 10 Mhz */

unsigned char resultado;
int aux;
int i;






Temporizacion a traves del modulo TIM.



*
Configuracion del TIM.
*
void delay_init(void){
T1SC = 0x30; /* TSTOP = 1, TIM counter inactivo, TRST = 1, Resetea el TIM => PS[2-0] = 000, TIM counter = 0*/
T1MOD = 3906; /* Inicializacion de los TIM Counter Modulo Registers */
T1SC = 0x06; /* TOIE = 0, interrupciones desabilitadas. TSTOP = 0, TIM counter activo. PS[2-0] = 110, divisor = 64*/
}


*
Retardo con resolucion de 100ms.

*
void delay (unsigned char time){

delay_init();
while(time > 0){
Espera a que se ponga a 1 el flag de overflow del temporizador
while(!(T1SC & 0x80));

Coloca en cero el flag TOF.
T1SC&=(~0x80);
time --;
}
T1SC = 0x30;
}

*
Retardo con resolucion de 1s.
*
void delay_s (unsigned char time){

while(time > 0){
delay(10);
time--;
}
}


*
Retardo con resolucion es de 1m.

*
void delay_m (unsigned char time){

while(time > 0){
delay_s(60);
time--;
}
}




Conversion Analogo-Digital a traves del modulo ADC.



/* (OJO esto no aplica a GP32. ).El (Vrefh) voltaje de referencia alto debe ser de 2.5 V,
de esta forma, por cada grado que aumenta el sensor el
modulo ADC aumenta en uno el valor de su salida */
/*Junio 5.08: EN GP32 SE COLOCA A 5 V EL Vrefhi y a GND (0V) el Vreflow*
/

*
Ininicializacion del modulo ADC.

*
void init_ADC(void){
ADCLK = 0x50; /* ADIV2-ADIV0 = 010, tasa de reloj 4.
ADICLK = 1, reloj de bus interno => frecuencia de reloj ADC = frecuencia interna / 4 = 0.625 Mhz */
}

*
Toma una muestra analoga y
la convierte a digital.

*
void muestrear(void){
ADSCR = 0x00; /* COCO (Conversions complete), se vuelve de solo lectura porque AIEN = 0 (bit de habilitacion de interrupciones),
se pone en 1 cuando finaliza una conversion y se pone en 0 cuando se lee un dato del registro de datos del ADC.
AIEN = 0, Interrupciones desabilitadas.
ADCO = 0 (Bit de conversion continua ADC), modo de una unica conversion ADC.
ADCH4-ADCH0 = 00000, (Bits de seleccion de canal conversion ADC), PTB0 */

Como esta configurado en modo de conversion unica, para que tome una muestra y la convierta, hay que escribir
en el registro ADSCR, en este caso hay que modificar el registro ADSCR para que vuelva a tomar una muestra, no basta con
solo leer el ADR (Registro de datos), ya que cuando este se lee, el bit COCO se vuelve 0, hay cambiar explicitamente el registro ADSCR.
resultado = 0;
while (!(ADSCR & 0x80));
resultado = ADR;
}




Comunicacion serial a traves del modulo SCI.


*
Inicializar el puerto serie.
velocidad: 9600 baudios

*
void sci_init(void){
SCBR = 0x04; 9600 baudios
SCC1 = 0x40;
habilitar el SCI
SCC2 = 0x0C; habilitar el transmisor y receptor
}


*
leer un caracter
por el puerto serie

*
unsigned char sci_leer_car(void){

Espera a que se ponga en uno el bit 5
while(!(SCS1&0x20));
return SCDR;
}

*
Enviar un caracter
por el puerto serie
ENTRADAS:
Caracter a enviar
EJEMPLO:
unsigned char MEMORIA1[30];
MEMORIA[7] = resultado();
sci_enviar_car(MEMORIA1[7]);

*
void sci_enviar_car(const char c){
Espera hasta que se pueda enviar algun caracter
Se tiene que activar el bit TDRE der registro SCSR
while(!(SCS1 & 0x80));
Enviar el caracter
SCDR = c;
}



Enviar una cadena
por el puerto serie
ENTRADAS:
Cadena a enviar
EJEMPLO:
char msg[30] = " Valor Digital ";
sci_enviar(msg);

void sci_enviar(const char *cad){
unsigned char i=0;
while(cad[i]!=0){
sci_enviar_car(cad[i]);
i++;
}
}




Programa principal


void main(void){
unsigned char MEMORIA1[30];
unsigned char MEMORIA2[30];
char MENSAJE1[ 6]="LLENO";
char MENSAJE2[11]="CALENTANDO";
char MENSAJE3[11]=" ";
/*char letra; *
/

char caracter;
CONFIG1 = 0x01; Desabilita el watchdog
EnableInterrupts;
Hàbilita interrupciones

for(i=0;i<30;i++){ INICIALIZA ARREGLOS
MEMORIA1[i] = 0;
MEMORIA2[i] = 0;
}

DDRB=0x7E;
Configura del PTB6-PTB1 como salidas y el PTB7 y el PTB0 como entrada
DDRA=0xFF; Configura del PTA7-PTB0 como salidas
PTB=0x00;
Coloca los BITS del puerto B en Bajo
PTA=0x00; Coloca los BITS del puerto A en Bajo

sci_init();
Inicializa el puerto Serial:Tx, Rx, 9600,none,1,none
init_ADC(); Inicializa el convertidor Analogo/Digital

*
Loop infinito.
(Se detiene con reset por harware)
(o retiro de fuente de alimentacion)

*

for(;;){

__RESET_WATCHDOG(); esta linea faltaba



/*-A-*/ if(!(PTB & 0x80)){
PTB = 0x00;
i=0;
while(i<1 && !(PTB & 0x80)){

muestrear();
MEMORIA1[i]=resultado;

PTA=resultado;

i++;
}
/*---*/ }

/*-B-*/ if((PTB & 0x80)){
PTB = 0x40;
i=0;

while(i<1 && (PTB & 0x80)){

sci_enviar_car(MEMORIA1[i]); Envia un BYTE al PC
MEMORIA2[i]=sci_leer_car();
PTA=MEMORIA2[i];



prueba RECIBE 1011 0100 ESTADO 4 DEL TANQUE
if (PTA == 0xB4){

delay_s(2);


sci_enviar_car(0x36); ENVIA EL valor para el CASE PARA EL CASO DE APAGAR RESISTENCIA Y VACIAR EL TANQUE LUEGO DESTE EVENTO NO MAS
delay_s(1);
}


i++;
}
PTB=0x00;
ES NECESARIA PARA ROMPER LA SALIDA de comunicacion Serial




/*---*/
}





} /* cierra loop */
} /* cierra main*/